我第一次接觸 Infrastructure as Code (IaC) 是為了在 AWS 與 GCP 上自動化資源配置。當時是使用 Golang 搭配 AWS SDK 與 GCP SDK 來完成需求。之後接觸到了 Terraform 這個熱門的 IaC 工具,才開始對 IaC 有更多的認識。
Terraform 是最知名的跨雲的 IaC 工具,因為他可以跨不同的雲端供應商,且提供豐富的 Provider,讓他成為跨雲 IaC 工具的首選。在自己用 Golang 管理雲端資源後,我的 Project 幾乎都是使用 Terraform 來管理雲端資源。
不過隨著對 Terraform 的使用加深,才發現到它所使用的 Domain Specific Language (DSL) 是它的優點也是它最大的缺點。
DSL 的優點在於語法上簡潔,可以用通用的語法去描述每個雲端資源,可以快速上手。
但缺點也是在於它語法簡潔,所以沒有提供複雜的操作方式。如果要完成比較複雜的任務,DSL 的表示也不太直觀。
例如要在 Terraform 中去判斷某個變數的值,去決定是否建立資源時,就得使用 count 來達成。不需要建立的時候 count 設定為 0,需要建立的時候 count 設定為 1 [2]。
resource "aws_s3_bucket" "example" {
count = var.create_bucket ? 1 : 0
bucket = var.bucket_name
}
之後 AWS 推出了新的 IaC 工具,AWS CDK (Cloud Development Kit),這個工具的好處是可以使用主流程式語言來撰寫 IaC code,例如 Java、Python、Go、TypeScript 等。
這個特點讓我眼睛一亮,看到它可以善用程式語言的特性,將複雜的 IaC 設定用程式語言的方式來表達,實在讓人很心動。
#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import {Construct} from 'constructs';
export class S3BucketStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
if (process.env['CREATE_BUCKET']) {
const s3Bucket = new s3.Bucket(this, 'ExampleBucket', {});
}
}
}
const app = new cdk.App();
new S3BucketStack(app, 'CdkStack', {});
後來沒有繼續深入使用 CDK 是基於以下理由:
直到最近在 iThome 的新聞上看到了 Pulumi [1],第一眼看到的時候覺得它與 CDK 很像,一樣都是透過程式語言來撰寫 IaC 框架。但它與 AWS CDK 不同的地方在於,它使用自己的執行引擎來管理狀態,不需要透過 CloudFormation,這也讓他匯入既有的雲端資源成為可能。甚至最近新推出的版本,內建將 Terraform 專案直接轉換成 Pulumi 專案,就讓我想嘗試學習 Pulumi 的使用,未來有機會也可以將目前 Terraform 專案轉為 Pulumi。
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
if (process.env['CREATE_BUCKET']) {
const bucket = new aws.s3.Bucket("example-bucket");
}
以上介紹也分別使用範例介紹如何在 Terraform、AWS CDK、Pulumi 中根據條件建立 s3 bucket,可以看到 Pulumi 的程式語法上比起 AWS CDK 所需要了解的更少、更直覺,這也是我想開始學習 Pulumi 的原因。
很多人應該會很疑惑,Terraform 用的好好的,為何要換到一套新的 IaC tool 呢?
由於筆者在新創公司工作,公司內並沒有專職的雲端環境管理人員,大部分的工程師都是開發應用程式的開發人員。對於一般的開發人員來說,Terraform 的學習門檻比較高,要改個雲端的設定,需要花費很多時間去了解 Terraform 與它的 DSL,比較複雜的流程都會伴隨的不直覺的設定方式,需要花費更多時間去理解。
但對開發人員來說 Pulumi 就像是一套 Library,只要學習這個 Library 有哪些 API 可以使用就好,其他的部分就是已經熟悉的程式語言。這也更好的能讓開發人員可以自己更動 Project 中所使用到的雲端資源。
預計本系列文章會涵蓋以下範圍的內容,如果大家有什麼建議的主題內容也可以在下方留言,因為沒有任何庫存的文章,所以之後實際的內容不一定會與以下大綱一致。
本系列的範例都會使用 TypeScript 程式語言撰寫,如果行有餘力會再提供 Python 版本的 範例程式碼。
範例程式碼皆會放在 GitHub 上。